2 שאלות לגסי סשן.
2.אם נגנב סשן למשתמש, אז לפורץ יש רק את המזהה של הסשן. הוא יכול להתחבר עם זה לאתר-במידה ויש שם ערך של שם,וסיסמא מוצפנת?(לדעתי כן כי הבדיקה מחזירה שבאמת יש כזה שם וסיסמא,אבל אני לא בטוח בזה.)
3.שאלה מספר 2 תקפה גם לגניבת קוקי
תודה
36 תשובות
1. ב 99% מהמקרים גניבת קוקי זה באמת חור מסוג xss באתר. ולאגן צריך לא על טפסים, אלה על הדפסת נתונים לעמוד. ראה עוד על XSS - Cross Site Scripting
אך כמובן שיכולים סתם לבוא למישהו הביית, להעתיק ממנו את כל הקוקיז לדיסק וללכת.
זה כבר פחות בעיה שלך :)
2. אם הוא גנב לך את הסשן - אז הוא יכול להיתחבר עם שמך. הוא לא יידע מה שם המשתמש והסיסמה, אבל אם הוא ישלח את אותו מזהה סשן שאתה בדרך כלל שולח לשרת - אז השרת יחשוב שהוא זה אתה.
מה ששמור בשרת בסשן לא מעניין אף אחד, מעניין רק המזהה הזה, ואם הוא יודע אותו - הוא יכול להתחזות לך.
3. כנ"ל לגבי קוקי. גנבו לך את הקוקי - השרת יפענח אותו - יוציא משם את שם המשתמש שלך ויחשוב שמי שעכשיו מחובר זה אתה
אז לגבי 1. צריך להשתמש בפונקצייה
וכדי בכל זאת להוסיף את האבטחה על הסשן/קוקי ליתר ביטחון..(או שלא כי זה מיותר??)
ולגבי 2. אסור לשמור בסשן פרטים מזהים כמו שם וסיסמה. אלא לשמור רק פרטים כמו: IP,סוג דפדפן,וID- בשביל שליפת נתונים.
אני צודק ב1 ו2?
בסשן מותר לשמור הכל כי אף אחד לא יכול לקרוא משם שום דבר חוץ ממך. בקוקי אסור, כי את הקוקי המשתמש יכול לקרוא. חוץ מזה בסשן אתה כבר לא צריך סיסמה, רק את שם המשתמש המזוהה
נכון שבסשן אני לא יכניס סיסמא,
אלא רק את שם המזהה ועוד כמה פרמטרים כמו IP וסוג דפדפן.
אבל אני שואל: נניח שיש לי בסשן שם וסיסמא,אז ברגע שהאקר מריץ את הסשן אמנם הוא לא רואה את המידע,אבל הוא מתחבר לאתר. לא כך?
דבר נוסף: כמו שאמרתי קודם,בסשן יש לי 3 פרמטרים ID IP וסוג דפדפן. אז אני צריך לשלוח 3 סשנים או שיש דרך נוחה יותר שהכל בסשן 1?
נכון, אבל זה לא משנה מה רשום לך בסשן, אם גנבו למשתמש את מזהה הסשן שלו - יכולים להתחזות אליו
אבל אם יש בסשן את הIP וגרסת הדפדפן שלו,
ובכל עמוד באתר יש בדיקה האם המידע הזה שבסשן שווה לגולש,אז אי אפשר להתחזות..
(כי הIP שלך שונה משל האקר סעודי,וגם הדפדפן יכול להיות שונה).
לגבי השאלה השנייה: אז אם עשיתי הגנת XSS אז אי אפשר לגנוב קוקי/סשן,אז כדי בכלל להגן על הסשן והקוקי עם כל הפרטים של IP ודפדפן או שזה כבר מיותר?
דבר נוסף למה שינית את הקוד לזה:htmlSpecialChars,במה זה שונה ממה שאני כתבתי:htmlentities
זה נכון. אתה יכול להוסיף באמת בדיקה בכל עמוד שה IP של הגולש זהה לזה שאיתו הוא הזדהה באתר בהתחלה. זה אקטואלי למקרים שכבר גנבו לך את הסשן. אם יש לך הגנה מפני xss אז אין אפשרות לגנוב לך את הסשן, ואז גם הבדיקה הזו מיותרת.
htmlSpecialChars מחליף רק את התווים שעושים בעיות ב htmlentity שלהם (כלומר גרש, גרשיים, אמפרסנד, גדול מ, קטן מ).
htmlEntities עושה את זה לכל התווים ואין צורך לעשות את זה לכל התווים. מספיק לעשות את ה encode רק לתווים שיכולים לעשות משהו בכלל.
לגבי החלק הראשון-תודה,אז אני לא צריך להתחיל לאבטח את הסשן/קוקי..
ולגבי מניעת XSS(שזה בעצם יגן על הסשן/קוקי) אז לא הבנתי בסופו של דבר: איזה פונקצייה לכתוב?-רק את
htmlSpecialChars?(*ואיזה פרמטרים לשים לו,חוץ מהמחרוזת כמובן)
זה לא הגנה מספיקה כי יש עם זה בעיות בדפדפנים ישנים יותר. לכן כדאי להשתמש ב-htmlpurifier.
קיבלתי כמה תובנות בעניין:
אנחנו מגנים על גניבת הקוקי/סשן,באמצעות מניעת XSS-שזה הדרך היחידה לגניבה(ע"י פילטרים או ביטוי רגולרי בטפסים).
אבל מה קורה אם המשתמש משנה את הקוקי של עצמו?-שאת זה הוא כבר לא צריך לגנוב...
לכן צריך לבצע גם הגנה על הקוקי/סשן כך:(תקנו אותי אם אני תועה)
סשן:מקבל רק ערך של ID לצורך שליפת נתונים(כי אין מצב לנחש את המזהה של הסשן-זה כמו ניחוש סיסמא)
קוקי:מקבל ID וסיסמא-מוצפנת. הID לצורך שליפת נתונים,והסיסמא: שלמקרה והוא ישנה את הפרטים בקוקי אז הוא צריך לכתוב סיסמא...כך שאין מצב לזה
וזה הגנה מספקת לדעתי.
>> אנחנו מגנים על גניבת הקוקי/סשן,באמצעות מניעת XSS-שזה הדרך היחידה לגניבה(ע"י פילטרים או ביטוי רגולרי בטפסים)
לא! זה ממש לא נכון. אתה מגן מפני sql injection ע"י פילטרים וביטויים, עם בכל (כי יותר בטוח real_escape
מ XSS אתה מגן רק עם htmlSpecialChars / htmlpurifier
כדי שמשתמש לא ישנה את הקוקי של עצמו לא צריך שום סיסמה.
צריך בסה"כ לגבב ( לשמור hash ) של הנתונים בקוקי, ככה שעם הוא ישנה את הנתונים הגלויים, את הנתונים בhash הוא לא ישנה. ראה דוגמה. אין שם סיסמה בקוקי, אבל אתה לא יכול לשנות שום דבר.
>>לא! זה ממש לא נכון..
זאת אומרת שהXSS פועל רק כשאני מדפיס את הקלט מהמשתמש?
(ואז פשוט להשתמש בפונקצייה htmlSpecialChars).
>>כדי שמשתמש לא ישנה את הקוקי של עצמו לא צריך שום סיסמה..
התכוונתי לומר שברגע שמנענו את גניבת הקוקי,אז נשאר לפצחן רק דרך אחת לפרוץ:
ע"י שהוא פותח את הקוקי של עצמו ומשנה שם את הפרטים.
אז אם נשים בקוקי רק ID הוא מנחש את זה בקלות
ולכן נשים בקוקי גם את הסיסמא(מוצפנת),ואז כדי לפרוץ למשתמש אחר הוא יצטרך להכניס לקוקי את הסיסמא של אותו משתמש שאותה הוא לא יודע.
[אבלבאמת לשנות את הקוקי של עצמו,כמו שאמרת זה חופשי,רק שהוא לא ידע איזה ערך(סיסמא)לשים]
ובכך לפי דעתי אבטחנו בצורה מלאה ונכונה את הקוקי והסשן
רק שלגבי סשן מספיק רק ID ולא צריך סיסמא כי המזהה של הסשן זה קצת יותר קשה לניחוש מאשר סיסמת המשתמש
הדברים נכונים,או שיש מה לשפר?
הכל נכון, כל הכבוד
חוץ מדבר אחד.
לא צריך שום סיסמה בקוקי. תנסה להבין את הקוד הזה. לא צריך שום סיסמה. אפשר בדרכים אחרות לבדוק שהוא לא שינה שום דבר.
אבל כמו שהראת בקוד,שאם יהיה רק ID הוא פשוט ישנה את זה בקלות,לעומת סיסמה שהוא צריך לנחש.
>>>אפשר בדרכים אחרות לבדוק שהוא לא שינה שום דבר.-התכוונת לסוג דפדפן וIP?
ד"א זה אותו משתמש(_96419)
לא. תשנה בקוד את ה ID למה שאתה רוצה, חוץ מ 10 הקוד יכתוב לך שאתה מתחזה.
ניסיתי ולא קורה כלום,לא הבנתי למה התכוונת..
מה זה "לא קורה כלום" ? נכבה המסך?
מה כתוב לך בריבוע הצהוב אם אתה משנה את ה ID ואם אתה לא משנה את ה ID ?
שאני משנה את $userid = 10; למס' 20 פשוט לא קורה כלום,(או שלא הבנתי למה התכוונת..)
ממ, הבנתי למה אתה מתכוון שאתה אומר "לא קורא כלום".
יהיה הרבה יותר פשוט לשנינו אם תיקרא את הקוד ותבין מה אתה מצפה שיקרה כשאתה משנה את המספר ל20, כי כרגע לא משנה לאיזה ערך אתה משנה את המשתנה בשורה הראשונה התוצאה שתראה על המסך לא תשתנה.
אם אתה לא מבין פונקציה כלשהי - פשוט תסתכל בדוקומניטציה (ובדוגמאות שיש שם).
אני לא הבנתי את הקוד שם..
ולא הבנתי עדיין מה הבעייה שהקוקי ישמור ID וסיסמא מוצפנת, הרי שהפצחן פותח את הקוקי הוא רואה את הפרטים שלו,ולגנוב קוקי הוא לא יכול כי יש הגנה מXSS.
ובסשן אותו דבר: הוא לא יכול לראות את הפרטים בסשן, ולגנוב: הוא לא יודע את המזהה של הסשן(ולא שייך להתחיל לנחש).
אז איזה בעיית אבטחה יש פה?
אני חושב שהכוונה היא שחבל סתם לערב את הסיסמא אם אין צורך בכך.
מה לא הבנת? תן שורות מדויקות וננסה להסביר לך. :)
>>>אני חושב שהכוונה היא שחבל סתם לערב את הסיסמא אם אין צורך בכך
אז איך אני יאמת בכל דף את המשתמש? הרי ID אפשר לשנות בקלות,וIP משתנה כל הזמן(מדובר בקוקי)
ומאפייני דפדפן-אתה יודע כמה יש להם את אותו אקספלור9?...
הנה הקוד מילה במילה עם תוספות של הסברים שלי. חלק בעברית וחלק באנגלית ממש פשוטה.
$somesecret = 'abcabcab'; // זה קוד סודי שלך.
// זו בעצם הסיסמא שלך, לא של המשתמש.
$validCookie = $userid .'-' . hash('sha256', $userid . $somesecret); // קוקי שמכיל את
// האיידי של המשתמש ואז מקף ואז הצפנה של האיידי
// של המשתמש ביחד עם הקוד שלך.
// now validCookie it's (without the enter):
// 10-dbdb4d162c56a34202281c492acb566ad
// d07e5949c7ff3ffcd27474235556052
// you do the setCookie stufff
// NOW COOL HACKER COMES AND CHANGES THE id to 55555555
// his new cookie will be (without the enter)
// 5555555555-dbdb4d162c56a34202281c492acb566a
// dd07e5949c7ff3ffcd27474235556052
// he doesn't know your 'somesecret', so he
// didn't know he have to hash his ID with your
// somesecret. in fact, he doesn't know your
// somesecret, he can't know that.
// now he visits your site with this cookie
// you validate it:
// this is his cookie
$_COOKIE['test'] = '5555555555-dbdb4d162c56a34202281c492acb566add07e5949c7ff3ffcd27474235556052';
// now you put what before "-" (this - 5555555555) in '$user',
// and the hash in '$hash';
list($user, $hash) = explode('-', $_COOKIE['test']);
// now you print the user id
echo 'hello user id ', $user;
// now you take the user id and your somesecret and hash it.
$expectedHash = hash('sha256', $user . $somesecret);
// now you check if what you created before is like the
// hash he have in his cookie.
if( $hash === $expectedHash ) echo ' you are real';
else echo ', but you are a hacker';
הבנתי רק עד השורה הזאת:
תוכל להסביר לי משם, תאורטי?
אתה כנראה פשוט לא מכיר את הפונקציות הללו. בשביל זה יש את הדוקומניטציה.
הסברתי בדיוק.
הנה:
// and the hash in '$hash';
כלומר, הוא לוקח את הקוקי של המשתמש. נכון היה בקוקי סימן מקף (-) בין ה-ID שלו לבין ההצפנה של ה-ID שלו עם הסיסמא שלך? בדיוק. אז הוא לוקח את ה-ID ושם אותו במשתנה $user, ואת ה-hash, ההצפנה, הוא שם במשתנה $hash.
עכשיו יש משתנה חדש בשם $expectedHash.
אנחנו לוקחים את ה-ID שהיה בקוקי ועושים מחדש הצפנה עם אותה הסיסמא המסובכת שלך, שרק מי שנכנס לקוד צד השרת של האתר יודע.
ועכשיו אנחנו פשוט בודקים אם ההצפנה שביצענו היא כמו ההצפנה שבקוקי. אם הוא שינה את ה-ID שבקוקי שלו - זה יזהה אותו כהאקר, כי הרי הוא לא שינה את ההצפנה שבקוקי שלו, אלא רק את ה-ID שבקוקי.
את ההצפנה אפשר רק עם הקוד ששמת ב-$somesecret.
>>> כי הרי הוא לא שינה את ההצפנה שבקוקי שלו, אלא רק את ה-ID שבקוקי.
ואם הוא ישנה גם את הסיסמא...אז הוא יוכל להיכנס..
אבל הוא לא יכול לשנות את הסיסמא כי הוא לא יכול להצפין את הסיסמא שלך ביחד עם ה-ID שלו כי אין לו גישה לקוד של האתר ולכן הוא לא יכול לגשת לסיסמא (somesecret) שלך.
זה מה שהבנתי:
בהתחברות לאתר אני שולף את הID שלו ומצפין את זה ביחד עם רצף מספרים קבועים.-והתוצאה למשתנה 'X'
רק לא הבנתי איך בכל דף אתה מבצע בדיקה: האם המשתנה X שווה ל...(אל מה אתה משווה אותו)?
-----
דבר נוסף: ואז נגיד שהכל טוב אז הוא מתחבר,עכשיו אני צריך לשלוף את השם שלו(בשביל לומר לו שלום)
וגם לשלוף את הID כדי להציג לו תוכן
ולפי השיטה שלך: איך אני יזהה את המשתמש בשביל שליפה הרי כל מה שיש לי עליו זה מספר כלשהוא.
אתה לוקח את ה-ID שלו, שם אותו במשתנה X, אחרי זה שם מקף (הסימן מקף, אתה יודע... ככה: -).
אחרי זה אתה לוקח את ה-ID שלו ומצפין אותו עם סיסמא שלך (לא חייב רק מספרים!) שנמצאת שם בקוד של האתר. את זה אתה שם אחרי המקף באותו המשתנה.
עכשיו הוא נכנס לאתר כשיש לו קוקי.
אתה לוקח מהקוקי את ה-ID שנמצא לפני המקף ושם במשתנה.
אתה לוקח גם את ההצפנה שיש אחרי המקף ושם במשתנה אחר.
אתה לוקח את ה-ID שנמצא במשתנה שיצרת מקודם ומעביר אותו הצפנה כמו בהתחברות ושם במשתנה אחר.
אתה לוקח את ההצפנה שהייתה בקוקי ובודק אם היא שווה להצפנה שיצרת מקודם.
זה הכל.
ואם הוא פותח את הקוקי שלו-אז הוא רואה את הID-הצופן
ואם הצופן גלוי לו אז מה שווה כל האבטחה-הוא פשוט ישנה רק את הID(את החלק שלפני המקף).
ההצפנה של ה-ID שלו עם הסיסמא שלך גלויה לו. אין לו סיכוי לפצח אותה ולגלות את הסיסמה שלך.
אם הוא משנה את ה-ID שלו (רק את החלק שלפני המקף), זה לא יעזור לו - אתה תזהה אותו כפורץ, כי לא תהיה לו ההצפנה של הסיסמא שלך עם ה-ID שהוא שם, אלא הצפנה של הסיסמא שלך עם ה-ID האמיתי שלו.